package org.fluxtream.core.aspects;
import java.lang.reflect.Method;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import com.newrelic.api.agent.NewRelic;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
/**
* User: candide
* Date: 12/03/13
* Time: 11:03
*/
@Aspect
public class NewRelicTransactionAspect {
FlxLogger logger = FlxLogger.getLogger(NewRelicTransactionAspect.class);
@Around("@annotation(get)")
public Object logGETRESTCall(ProceedingJoinPoint pjp, final GET get) throws Throwable {
return logRESTCall(pjp, "GET");
}
@Around("@annotation(post)")
public Object logPOSTRESTCall(ProceedingJoinPoint pjp, final POST post) throws Throwable {
return logRESTCall(pjp, "POST");
}
@Around("@annotation(delete)")
public Object logDELETERESTCall(ProceedingJoinPoint pjp, final DELETE delete) throws Throwable {
return logRESTCall(pjp, "DELETE");
}
private Object logRESTCall(ProceedingJoinPoint pjp, String httpMethod) throws Throwable {
Object obj;
logArguments(pjp, httpMethod);
try {
obj = pjp.proceed();
} catch (Exception e) {
NewRelic.noticeError(e);
throw e;
}
return obj;
}
private void logArguments(ProceedingJoinPoint pjp, String httpMethod) {
try {
StringBuilder sb = new StringBuilder(httpMethod).append(" ");
final Path classPathAnnotation = pjp.getTarget().getClass().getAnnotation(Path.class);
if (classPathAnnotation!=null)
sb.append(classPathAnnotation.value());
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
final Path methodPathAnnotation = method.getAnnotation(Path.class);
if (methodPathAnnotation!=null)
sb.append(methodPathAnnotation.value());
NewRelic.setTransactionName(null, sb.toString());
} catch (Throwable t) {
logger.warn("Could not log arguments for join point: " + pjp);
}
}
}